//
//  main.c
//  Cycle
//
//  Created by admin on 2019/7/16.
//  Copyright © 2019 猫爷爷的酱醋茶. All rights reserved.
//

#include <stdio.h>

#include <stdlib.h>
/*
 
 循环的两种情况：
 1）循环次数确定的情况；一般使用for循环。
 2）循环次数不确定的循环，但是确定循环继续或者结束的条件，一般使用while循环。
 
 while循环 - 结束方式
 1）判断循环条件为假；
 2）在循环体内部使用break； - 立即结束并跳出循环，不再执行循环体其他代码。例：GuessTheNumber();
 3）在循环体中遇到continue，会立即结束本次循环，不再执行后续代码，而是回去继续判断循环条件。例:SequentialOutput();
 
 穷举：一个一个挨个试的方法。
 有一筐鸡蛋，看见一个农夫，两个两个的数，多1个；三个三个的数，多1个；四个四个的数，还是多1个，请问有多少个鸡蛋。例：Exhuastive();
 操场有100多名学生，分组情况为，3个人1组，多1人；4个人1组，多2人；5个人1组，多3人，请问有多少位学生在操场。
 
 
 for循环和while循环一样，可以说是专门为while循环增量设置的。
 for(定义表达式A;判断表达式B;循环增量表达式C) //这三个表达式其实任意的C语言都可以。例：TheForCycle();
 {
 
 }
 
 
 continue在for循环和while循环的不同，
在for循环中，continue了以后，还会执行循环后的操作表达式，而while直接结束本次循环体，立即回去判断循环条件。
 例：TheContinueDifferentOnFor(); TheContinueDifferentOnWhile();
 
 
 goto语句
 1）先为想要跳转的位置做一个标记，为这个位置取一个标签名；
    标签名随意，要符合标识符的命名规范和规则。
    语法格式  标签名：   例，loop：
 2）想要在什么地方跳转到做标记的地方，就在哪个地方写上
    goto 标签名;
 3）goto语句也可以实现我们的循环操作，但在使用的时候，需要注意避免死循环。
 
 
 
 
 
 面试题：
 
 for(int i = 0;i < 10;i++)
 {
    for(int j = 0;j < 10;j++)
    {
        //在这里写一段代码，结束最外层循环语句。
    }
 }
 
 例：InterviewQuestion();
 
 
 */

///猜数
void GuessTheNumber(void);

///顺序输出
void SequentialOutput_Error(void);

///顺序输出
void SequentialOutput(void);

///穷举
void Exhaustive(void);
void Exhaustive2(void);

///for循环
void TheForCycle(void);

///循环练习题1
void TheCycleExercise1(void);

//循环练习题2
void TheCycleExercise2(void);

//乘法口诀
void MultiplicationFormulas(void);

//余额宝利息
void Interest(void);

//goto语句
void TestTheGoto(void);

//面试题
void InterviewQuestion(void);

///continue在for的不同
void TheContinueDifferentOnFor(void);
///continue在while的不同
void TheContinueDifferentOnWhile(void);


int main(int argc, const char * argv[]) {
    
    TheContinueDifferentOnFor();
    return 0;
}


//continue在while的不同
void TheContinueDifferentOnWhile(void)
{
    int i = 0;
    while (i < 5) {
        printf("-------我是分割线-------\n");
        if (i == 2) {
            continue;
        }
        i++;
    }
}

//continue的不同
void TheContinueDifferentOnFor(void)
{
    
    for (int i = 0; i < 5; i++) {
        
        printf("-------我是分割线-------\n");
        if (i == 2) {
            continue;
        }
        printf("i = %d\n",i);
        
    }
    
}


//面试题
void InterviewQuestion()
{
    for(int i = 0;i < 10;i++)
    {
        for(int j = 0;j < 10;)
        {
            //在这里写一段代码，结束最外层循环语句。
            i = 10;
            break;
            
            //break\continue只能作用于当前循环。
        }
    }
}



//goto语句
void TestTheGoto(void)
{
    //随即产生一个数
    int number = arc4random_uniform(100);
    printf("这个数在0-99之间，你觉得会是什么数？\n");
    int guessNumber = 0;
    int guessFrequency = 1;
    Loop:  //取标签名下面的一行代码，不能是声明变量。
    scanf("%d",&guessNumber);
    
    if (guessNumber != number) {
        
        if (guessNumber > number ) {
            printf("这个数大了，再来一次！\n");
        }else{
            printf("这个数小了，再来一次！\n");
        }
        guessFrequency += 1;
        goto Loop;
    }
    
    printf("一共猜了%d次，你太聪明了！\n",guessFrequency);
    
    
}

//余额宝利息
void Interest(void)
{
    
    double interest = 2.4270*0.01;
    printf("One year the interest is %lf\n",interest);
    printf("Please enter your principal:\n");
    double money = 0.0;
    scanf("%lf",&money);
    double result = money * interest;
    printf("One year after,your money is %.2lf\n",result);

    
    
}

//乘法口诀
void MultiplicationFormulas()
{
    for (int i = 1; i < 10 ; i++) {
        for (int j = 1; j <= i; j++) {
            int result = i * j;
            printf("%d x %d = %d\t",j,i,result);
        }
        printf("\n");
    }
}

//循环练习题2
void TheCycleExercise2(void)
{
    
    for(int i = 10;i > 0;i--)
    {
        for(int j = i-1;j > 0;j--)
        {
            printf(" ");
        }
        
        for(int k = 0;k <= (10 - i);k++ )
        {
            printf("*");
        }
        
        printf("\n");
    }
    
}



//循环练习题1
void TheCycleExercise1(void)
{
    int i;
    for(i = 1; i < 11;i++)
    {
        for(int j = i;j>0;j--)
        {
            printf("*");
        }
         printf("\n");
    }
    
    for(i -= 2;i > 0;i--)
    {
        for(int j = i;j>0;j--)
        {
            printf("*");
        }
        printf("\n");
    }
   
    
}



//for循环
void TheForCycle(void)
{
    
    for(printf("A");printf("B");printf("C"))
    {
        printf("D");//ABDC BDC BDC
        //break;
    }
    
}

//穷举
void Exhaustive2(void)
{
    int studentNumber = 100;
    while (1) {
        if(studentNumber % 3 == 1 && studentNumber % 4 == 2 && studentNumber % 5 ==3 )
        {
            printf("操场有%d位学生。\n",studentNumber);
            break;
        }
        studentNumber++;
    }
    
}
//穷举
void Exhaustiveive(void)
{
    int eggNumber = 2;
    while (1)
    {
        
        if(eggNumber % 2 == 1 && eggNumber % 3 == 1 && eggNumber % 4 == 1)
        {
            printf("这个箩筐，鸡蛋有%d个。\n",eggNumber);
            break;
        }
        eggNumber++;
    }
    
    
}

//顺序输出
void SequentialOutput(void)
{
    int i = 0;
    while (i < 5)
    {
        i++;
        printf("%d\n",i);
        if(i == 3)
        {
            continue;
        }
        printf("------\n");
       
    }
}

//顺序输出
void SequentialOutput_Error(void)
{
    int i = 0;
    while (i < 5)
    {
        printf("%d\n",i);
        if(i == 3)
        {
            continue;
        }
        printf("------\n");
        i++;
    }
    
    
}



//猜数
void GuessTheNumber(void)
{
    //随机产生0-99的数
    int number = arc4random_uniform(100);
    printf("这个数在0-99之间，你觉得会是什么数？\n");
    int guessNumber = 0;
    int guessFrequency = 0;
    while(1)
    {
        guessFrequency += 1;
        printf("第%d次猜数\n",guessFrequency);
        scanf("%d",&guessNumber);
        if(guessNumber == number)//循环结束的条件
        {
            printf("你简直太聪明了！\n");
            break;
        }
        else if(number >  guessNumber)
        {
            printf("没猜对，数字小了，再猜一次！\n");
        }else{
            printf("没猜对，数字大了，再猜一次！\n");
        }
    
        
        
    }
    
    
}
